#! /usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2020/10/4 17:37
# @Author : youngchaolin

''''''

'''
内置函数
'''

# int：用于将一个字符串或数字转换为整形
print(int(3.1415926))

# float：用于将一个字符串或数字转换为浮点数
print(float(3))

# 21 print：打印，默认参数有分隔符，为' '
print(1,2,3)
print(1,2,3,sep='#')

# 22 list：创建列表
l1=list('messi')
print(l1)

# 23 dict：创建字典
print(dict([('messi',34),('ronald',35),('herry',55)]))
print(dict(name='messi',age=34))
print({'messi':34})

# 24 abs：绝对值
print(abs(-20))

# 25 reversed 将一个序列翻转，返回翻转序列的迭代器
str=reversed('messi')
# for item in str:
#     print(item)

print(list(str))

# 26 sum
li=[i for i in range(10)]
print(sum(li))
# 从200算起，如果没有第二个参数就是求li的和
print(sum(li,200))

# 27 zip 拉链方法
l1=['messi','ronald','herry']
l2=('1','2','3','4','5')
l3={'阿根廷','葡萄牙','法国','德国'}
obj=zip(l1,l2,l3)
print(obj) # <zip object at 0x00000232375F3188>
for item in obj:
    # 打印的是元祖
    print(item)
print(list(obj))

# 28 min max 最重要的方法
l1=[22,11,-66,-3,-5,223,456]
print(min(l1))
# 以绝对值的方式求最小值
# 普通实现
func1=lambda a:abs(a)
l2=[]
for item in l1:
    l2.append(func1(item))
print(min(l2))

# min方法的高级实现
absolute=lambda a:abs(a)
# min可以传入第二个参数，会自动将可迭代对象中的每个元素按照顺序传入到key对应的函数中
print(min(l1,key=absolute))

# 求出值最小的键
dic={'a':3,'b':2,'c':1}

# 默认按照字典的键去比较大小，传入的参数是键
print(min(dic))
# 按键返回值
def compare(key):
    return dic.get(key)
# 按值比较
print(min(dic,key=compare))
# 也可以写匿名函数
print(min(dic,key=lambda key:dic.get(key)))
# 第一次比较，key为a,传进去返回3，记录3
# 第二次比较，key为b,传进去返回2，2比3小，记录2
# 第三次比较，key为c,传进去返回1，1比2小，记录1

# 比较如下列表中元祖，得出年龄最小的元祖
li=[('messi',16),('alex',33),('clyang',18)]
print(min(li)) # ('alex', 33)
# 使用lambda表达式，传入的元素是元祖
print(min(li,key=lambda tuple:tuple[1]))

# max的使用省略

# 29 sorted 排序
l1=[1,2,44,5,6,7,77]
l2=sorted(l1)
print(l1)
print(l2)

li=[('messi',16),('alex',33),('clyang',18)]
# 默认按照元祖第一个元素来排序
print(sorted(li))
# 可以倒序
print(sorted(li,reverse=True))
# 按照年龄升序来排序
print(sorted(li,key=lambda tuple:tuple[1]))
# 按照年龄倒序来排序
print(sorted(li,key=lambda tuple:tuple[1],reverse=True))

# 30 filter 列表推导式的筛选模式，filter返回的是一个迭代器
li=[1,2,3,4,5,6,7,8]
# 过滤出列表中大于3的元素
print([i for i in li if i>3])
# 使用filter
ret=filter(lambda i:i>3,li)
print(ret) # <filter object at 0x0000024CCC223588>
print(list(ret))
# 31 map 列表推导式的循环模式，map返回的是一个迭代器
li=[i**2 for i in range(1,6)]
print(li)

# 使用map
ret=map(lambda x:x**2,range(1,6))
print(ret) # <map object at 0x0000024CCC223668>
print(list(ret))

# 32 reduce 需要从一个模块中引用，reduce有点类似MapReduce中的reduce的意思
from functools import reduce
def func(a,b):
    return a+b
li=reduce(func,[1,2,3,4])
print(li)
# TODO 统计以下字符出现的次数，方法待修改
l1=[('messi',1),('messi',1),('messi',1),('clyang',2)]
def func(t1,t2):
    # name相同的，计数相加
    if t1[0]==t2[0]:
        return (t1[0],t1[1]+t2[1])
    else:
        # 否则原路返回
        return t1,t2
li=reduce(func,l1)
print(li) # ((('messi', 3), ('clyang', 2)))




